package net.suncaper.mvc.service.impl;

import net.suncaper.mvc.exception.BusinessException;
import net.suncaper.mvc.mapper.ReviewMapper;
import net.suncaper.mvc.mapper.impl.ReviewMapperImpl;
import net.suncaper.mvc.model.domain.Message;
import net.suncaper.mvc.model.domain.Review;
import net.suncaper.mvc.service.IHotelService;
import net.suncaper.mvc.service.IMessageService;
import net.suncaper.mvc.service.IReviewService;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 评价信息服务接口实现
 */
public class ReviewServiceImpl implements IReviewService {
    private final ReviewMapper reviewMapper = new ReviewMapperImpl();
    private final IHotelService hotelService = new HotelServiceImpl();
    private final IMessageService messageService = new MessageServiceImpl();
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 添加评价
     * @param review 评价信息
     * @return 添加结果
     */
    @Override
    public boolean addReview(Review review) {
        // 校验必填字段
        if (review.getUserId() == null || review.getHotelName() == null || 
            review.getRating() == null || review.getReviewTime() == null) {
            throw new BusinessException("评价信息不完整，请补充必要信息");
        }
        
        // 检查用户和酒店是否存在的逻辑（需要调用UserService和HotelService）
        // 此处省略具体实现
        
        // 添加评价
        boolean result = reviewMapper.insertReview(review);
        
        // 如果评价添加成功，重新计算并更新酒店评分
        if (result) {
            try {
                // 计算酒店的平均评分
                BigDecimal averageRating = reviewMapper.calculateAverageRating(review.getHotelName());
                
                if (averageRating != null) {
                    // 四舍五入到一位小数
                    averageRating = averageRating.setScale(1, RoundingMode.HALF_UP);
                    
                    // 更新酒店评分
                    hotelService.updateHotelRating(review.getHotelName(), averageRating);
                    
                    System.out.println("[ReviewServiceImpl.addReview] 已更新酒店 " + 
                        review.getHotelName() + " 的评分为: " + averageRating);
                }
            } catch (Exception e) {
                System.err.println("[ReviewServiceImpl.addReview] 更新酒店评分时出错: " + e.getMessage());
                // 不抛出异常，因为评论已经成功添加，评分更新失败不应影响主流程
            }
            
            try {
                // 获取酒店对应的商家用户ID
                String hotelOwnerId = hotelService.getHotelOwnerIdByName(review.getHotelName());
                
                if (hotelOwnerId != null) {
                    // 添加消息通知酒店商家
                    Message message = new Message();
                    message.setUserId(hotelOwnerId);
                    message.setTitle("新评论通知");
                    
                    // 如果评论内容过长，截断显示
                    String reviewContent = review.getContent();
                    if (reviewContent != null && reviewContent.length() > 20) {
                        reviewContent = reviewContent.substring(0, 20) + "...";
                    } else if (reviewContent == null) {
                        reviewContent = "";
                    }
                    
                    message.setContent("您的酒店\"" + review.getHotelName() + "\"收到了新评论，评分：" 
                        + review.getRating() + "，内容：" + reviewContent);
                    message.setType("hotel_review");
                    message.setRelatedId(review.getReviewId() != null ? review.getReviewId().toString() : "");
                    message.setIsRead(false);
                    message.setCreateTime(new Date());
                    
                    messageService.addMessage(message);
                }
            } catch (Exception e) {
                // 记录日志但不影响主流程
                System.err.println("[ReviewServiceImpl.addReview] 发送消息通知失败: " + e.getMessage());
            }
        }
        
        return result;
    }

    /**
     * 根据酒店名称获取评价列表
     * @param hotelName 酒店名称
     * @return 评价列表
     */
    @Override
    public List<Review> getReviewsByHotelName(String hotelName) {
        return reviewMapper.selectReviewsByHotelName(hotelName);
    }

    /**
     * 根据用户ID获取评价列表
     * @param userId 用户ID
     * @return 评价列表
     */
    @Override
    public List<Review> getReviewsByUserId(String userId) {
        return reviewMapper.selectReviewsByUserId(userId);
    }
    
    /**
     * 根据评价ID获取评价
     * @param reviewId 评价ID
     * @return 评价信息
     */
    @Override
    public Review getReviewById(Long reviewId) {
        return reviewMapper.selectReviewById(reviewId);
    }

    @Override
    public java.util.List<Review> getAllReviews() {
        return reviewMapper.selectAllReviews();
    }

    /**
     * 更新评价信息
     * @param review 评价信息
     * @return 更新结果
     */
    @Override
    public boolean updateReview(Review review) {
        // 校验是否存在
        Review existingReview = reviewMapper.selectReviewById(review.getReviewId());
        if (existingReview == null) {
            throw new BusinessException("要更新的评价不存在");
        }
        
        // 自动设置当前时间
        review.setReviewTime(new Date());
        
        // 保留原有的用户ID和酒店名称
        review.setUserId(existingReview.getUserId());
        review.setHotelName(existingReview.getHotelName());
        
        boolean result = reviewMapper.updateReview(review);
        
        // 如果评价更新成功，重新计算并更新酒店评分
        if (result) {
            try {
                // 计算酒店的平均评分
                BigDecimal averageRating = reviewMapper.calculateAverageRating(existingReview.getHotelName());
                
                if (averageRating != null) {
                    // 四舍五入到一位小数
                    averageRating = averageRating.setScale(1, RoundingMode.HALF_UP);
                    
                    // 更新酒店评分
                    hotelService.updateHotelRating(existingReview.getHotelName(), averageRating);
                    
                    System.out.println("[ReviewServiceImpl.updateReview] 已更新酒店 " + 
                        existingReview.getHotelName() + " 的评分为: " + averageRating);
                }
            } catch (Exception e) {
                System.err.println("[ReviewServiceImpl.updateReview] 更新酒店评分时出错: " + e.getMessage());
            }
        }
        
        return result;
    }

    @Override
    public Review getReviewByTime(java.util.Date reviewTime) {
        String reviewTimeStr = DATE_FORMAT.format(reviewTime);
        return reviewMapper.selectReviewByTime(reviewTimeStr);
    }

    /**
     * 删除评价
     * @param reviewId 评价ID
     * @return 删除结果
     */
    @Override
    public boolean deleteReviewById(Long reviewId) {
        // 获取评论信息以获取酒店名称
        Review existingReview = reviewMapper.selectReviewById(reviewId);
        if (existingReview == null) {
            throw new BusinessException("要删除的评价不存在");
        }
        
        String hotelName = existingReview.getHotelName();
        
        boolean result = reviewMapper.deleteReviewById(reviewId);
        
        // 如果评价删除成功，重新计算并更新酒店评分
        if (result) {
            try {
                // 计算酒店的平均评分
                BigDecimal averageRating = reviewMapper.calculateAverageRating(hotelName);
                
                // 更新酒店评分，如果没有评论了，评分为null
                hotelService.updateHotelRating(hotelName, averageRating);
                
                System.out.println("[ReviewServiceImpl.deleteReviewById] 已更新酒店 " + 
                    hotelName + " 的评分为: " + (averageRating != null ? averageRating : "null"));
                
            } catch (Exception e) {
                System.err.println("[ReviewServiceImpl.deleteReviewById] 更新酒店评分时出错: " + e.getMessage());
            }
        }
        
        return result;
    }
}    